package com.Hsu.blog.utils;

/**
 * @author Hsu琛君珩
 * @ClassName:JwtUtils
 * @date 2024-01-25
 * @apiNote
 * @Version: v1.0
 */

import io.jsonwebtoken.*;
import io.jsonwebtoken.io.Decoders;
import io.jsonwebtoken.io.Encoders;
import io.jsonwebtoken.security.Keys;
import io.jsonwebtoken.security.SignatureException;
import lombok.extern.slf4j.Slf4j;

import javax.crypto.SecretKey;
import java.security.Key;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

/**
 * Jwt工具类
 */
@Slf4j
public class JwtUtils {
    //过期时间：30分钟
    private static final long expiration = 60 * 60 * 1000;
    //JWT的签名密钥，以Base64编码
    private static final String secretString = "3Mej4bNBXq4hdUMPD3wWojZxtNhdIcfP4BiBrmDXccU=";
    private static final Key key = Keys.hmacShaKeyFor(Decoders.BASE64.decode(secretString));//签名

    //1.生成token
    public static String genToken(Map<String,Object> claim) {//负载
        String token = Jwts.builder()//头部，但没有设置内容
                .setClaims(claim)//设置负载
                .setExpiration(new Date(System.currentTimeMillis() + expiration))//设置过期时间
                .signWith(key)//设置签名
                .compact();//结合以上信息生成token
        return token;
    }

    //2.验证token
    public static Claims parseToken(String token) {
        if(token==null){
            return null;
        }
        JwtParser build=Jwts.parserBuilder().setSigningKey(key).build();//生成解析器
        Claims claims=null;
        try {
            claims= build.parseClaimsJws(token).getBody();//负载
        } catch (Exception e) {
            log.error("解析token失败，token："+token);
        }
        return claims;
    }

    //通过token获取用户Id
    public static Integer getUserIdFromToken(String token){
        Claims claims=parseToken(token);
        if(claims==null){
            return null;
        }
        return (Integer) claims.get("id");
    }
}
